# 访问和限制


class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score

# 从前面Student类的定义来看，外部代码还是可以自由地修改一个实例的name、score属性


ls = Student('lisi', 68)
print(ls.score)
ls.score = 86
print(ls.score)
# 如果要让内部属性不被外部访问，可以把属性的名称前加上两个下划线__，在Python中，实例的变量名如果以__开头，就变成了一个私有变量（private），只有内部可以访问，外部不能访问


class Student2(object):
    def __init__(self, name, score):
        self.__name = name
        self.__score = score

    def get_name(self):
        return self.__name

    def get_score(self):
        return self.__score

    def set_score(self, score):
        if score <= 100:
            self.__score = score
        else:
            raise ValueError('bad score')


zs = Student2('zhangsan', 88)
# print(zs.__name)    # 访问不了

# 但是如果外部代码要获取name和score怎么办？可以给Student类增加get_name和get_score这样的方法
print(zs.get_name())
zs.set_score(100)
print(zs.get_score())
print(zs._Student2__name)

